#include "zhi.h"
//创建一个空函数
函数对象S* 新建一个空函数(虚拟机* 虚拟机S, 模块对象S* objModule, uint32_t slotNum) {
   函数对象S* objFn = 分配指定类型的内存块M(虚拟机S, 函数对象S); 
   if (objFn == NULL) {
      内存分配_错误("allocate 函数对象S failed!"); 
   }
   初始化对象头(虚拟机S, &objFn->objHeader, 对象类型_函数, 虚拟机S->fnClass);
   ByteBufferInit(&objFn->instrStream);
   ValueBufferInit(&objFn->constants);
   objFn->module = objModule;
   objFn->maxStackSlotUsedNum = slotNum;
   objFn->upvalueNum = objFn->argNum = 0;
#ifdef DEBUG
   objFn->debug = 分配指定类型的内存块M(虚拟机S, 函数调试S);
   objFn->debug->fnName = NULL;
   IntBufferInit(&objFn->debug->行号);
#endif
   return objFn;
}

//以函数fn创建一个闭包
闭包对象S* 以函数fn创建一个闭包(虚拟机* 虚拟机S, 函数对象S* objFn) {
   闭包对象S* objClosure = 分配除主类型外还需要额外指定大小的内存M(虚拟机S, 
	 闭包对象S, sizeof(上一层对象S*) * objFn->upvalueNum);
   初始化对象头(虚拟机S, &objClosure->objHeader, 对象类型_闭包, 虚拟机S->fnClass);
   objClosure->fn = objFn;
   
   //清除upvalue数组做 以避免在填充upvalue数组之前触发GC
   uint32_t idx = 0;
   while (idx < objFn->upvalueNum) {
      objClosure->upvalues[idx] = NULL; 
      idx++;
   }

   return objClosure;
}

//创建upvalue对象
上一层对象S* 创建上一层值对象(虚拟机* 虚拟机S, Value* localVarPtr) {
   上一层对象S* objUpvalue = 分配指定类型的内存块M(虚拟机S, 上一层对象S);
   初始化对象头(虚拟机S, &objUpvalue->objHeader, 对象类型_自由变量, NULL);
   objUpvalue->localVarPtr = localVarPtr;
   objUpvalue->closedUpvalue = VT_TO_VALUE(值类型_空);
   objUpvalue->next = NULL;
   return objUpvalue;
}
